home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / plan / src / cnfmenu.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  22KB  |  624 lines

  1. /*
  2.  * Create and destroy the alarm configuration popup. It contains possible
  3.  * actions to be taken when a warn or alarm time triggers. The information
  4.  * is saved at the beginning of the .schedule file; the daemon needs it.
  5.  *
  6.  *    destroy_config_popup()
  7.  *    create_config_popup()
  8.  */
  9.  
  10. #ifndef MIPS
  11. #include <stdlib.h>
  12. #endif
  13. #include <stdio.h>
  14. #include <time.h>
  15. #include <Xm/Xm.h>
  16. #include <Xm/DialogS.h>
  17. #include <Xm/Form.h>
  18. #include <Xm/Frame.h>
  19. #include <Xm/RowColumn.h>
  20. #include <Xm/LabelP.h>
  21. #include <Xm/LabelG.h>
  22. #include <Xm/PushBP.h>
  23. #include <Xm/PushBG.h>
  24. #include <Xm/ToggleB.h>
  25. #include <Xm/TextF.h>
  26. #include <Xm/Protocols.h>
  27. #include "cal.h"
  28.  
  29. extern void help_callback();
  30. extern char *mystrdup();
  31. extern time_t parse_timestring();
  32. static void done_callback(), toggle_callback(), mailer_callback(),
  33.         timeout_callback(), ewarn_prog_callback(), lwarn_prog_callback(),
  34.         alarm_prog_callback();
  35.  
  36. extern Display        *display;    /* everybody uses the same server */
  37. extern struct edit    edit;        /* info about entry being edited */
  38. extern struct config    config;        /* global configuration data */
  39. extern Pixel        color[NCOLS];    /* colors: COL_* */
  40. extern XFontStruct    *font[NFONTS];    /* fonts: FONT_* */
  41. extern struct list    *mainlist;    /* list of all schedule entries */
  42.  
  43. static BOOL        have_shell;    /* message popup exists if TRUE */
  44. static Widget        shell;        /* popup menu shell */
  45. static Widget        ewarn_prog;    /* early-warn program text */
  46. static Widget        lwarn_prog;    /* late-warn program text */
  47. static Widget        alarm_prog;    /* alarm time program text */
  48. static Widget        mailer;        /* mailer command line text */
  49. static Widget        timeout;    /* max lifetime of notifiers */
  50.  
  51.  
  52. /*
  53.  * destroy a popup. Remove it from the screen, and destroy its widgets.
  54.  * It's too much trouble to keep them for next time.
  55.  */
  56.  
  57. destroy_config_popup()
  58. {
  59.     char        *string;    /* contents of text widget */
  60.     char        *p;        /* for stripping leading blanks */
  61.  
  62.     if (have_shell) {
  63.         string = XmTextFieldGetString(ewarn_prog);
  64.         if (config.ewarn_prog)
  65.             free(config.ewarn_prog);
  66.         for (p=string; *p == ' ' || *p == '\t'; p++);
  67.         config.ewarn_prog = mystrdup(p);
  68.         XtFree(string);
  69.  
  70.         string = XmTextFieldGetString(lwarn_prog);
  71.         if (config.lwarn_prog)
  72.             free(config.lwarn_prog);
  73.         for (p=string; *p == ' ' || *p == '\t'; p++);
  74.         config.lwarn_prog = mystrdup(p);
  75.         XtFree(string);
  76.  
  77.         string = XmTextFieldGetString(alarm_prog);
  78.         if (config.alarm_prog)
  79.             free(config.alarm_prog);
  80.         for (p=string; *p == ' ' || *p == '\t'; p++);
  81.         config.alarm_prog = mystrdup(p);
  82.         XtFree(string);
  83.  
  84.         string = XmTextFieldGetString(mailer);
  85.         if (config.mailer)
  86.             free(config.mailer);
  87.         for (p=string; *p == ' ' || *p == '\t'; p++);
  88.         config.mailer = mystrdup(p);
  89.         XtFree(string);
  90.  
  91.         string = XmTextFieldGetString(timeout);
  92.         config.wintimeout = parse_timestring(string);
  93.         XtFree(string);
  94.  
  95.         XtPopdown(shell);
  96.         XTDESTROYWIDGET(shell);
  97.         have_shell = FALSE;
  98.         mainlist->modified = TRUE;
  99.     }
  100. }
  101.  
  102.  
  103. /*
  104.  * create a config popup as a separate application shell. The popup is
  105.  * initialized with data from config.
  106.  */
  107.  
  108. create_config_popup()
  109. {
  110.     Widget            form, frame, form2, rowcol, w;
  111.     Arg            args[20];
  112.     int            n;
  113.     Atom            closewindow;
  114.     int            len;
  115.  
  116.     destroy_config_popup();
  117.     len = XTextWidth(font[FONT_STD], "Early warning:", 14);
  118.  
  119.     n = 0;
  120.     XtSetArg(args[n], XmNdeleteResponse,    XmDO_NOTHING);        n++;
  121.     XtSetArg(args[n], XmNiconic,        False);            n++;
  122.     shell = XtAppCreateShell("Alarm Options", "plan",
  123.             applicationShellWidgetClass, display, args, n);
  124. #    ifdef EDITRES
  125.     XtAddEventHandler(shell, (EventMask)0, TRUE, 
  126.              _XEditResCheckMessages, NULL);
  127. #    endif
  128.     set_icon(shell, 1);
  129.     form = XtCreateManagedWidget("cnfform1", xmFormWidgetClass,
  130.             shell, NULL, 0);
  131.     XtAddCallback(form, XmNhelpCallback, help_callback, (XtPointer)"opt");
  132.  
  133.                             /*-- early warn --*/
  134.     n = 0;
  135.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM)    ;    n++;
  136.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  137.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  138.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  139.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  140.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  141.     XtSetArg(args[n], XmNshadowType,    XmSHADOW_ETCHED_IN);    n++;
  142.     frame = XtCreateManagedWidget("", xmFrameWidgetClass,
  143.             form, args, n);
  144.     form2 = XtCreateManagedWidget("cnfform2", xmFormWidgetClass,
  145.             frame, NULL, 0);
  146.     XtAddCallback(form2, XmNhelpCallback,
  147.                     help_callback, (XtPointer)"opt_early");
  148.  
  149.     n = 0;
  150.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  151.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  152.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  153.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  154.     XtSetArg(args[n], XmNwidth,        len);            n++;
  155.     w = XtCreateManagedWidget("Early warning:", xmLabelWidgetClass,
  156.             form2, args, n);
  157.     n = 0;
  158.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  159.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  160.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  161.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  162.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  163.     XtSetArg(args[n], XmNspacing,        4);            n++;
  164.     rowcol = XtCreateManagedWidget("", xmRowColumnWidgetClass,
  165.             form2, args, n);
  166.     n = 0;
  167.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  168.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  169.     XtSetArg(args[n], XmNset,        config.ewarn_window);    n++;
  170.     w = XtCreateManagedWidget("Green window", xmToggleButtonWidgetClass,
  171.         rowcol, args, n);
  172.     XtAddCallback(w, XmNvalueChangedCallback,
  173.                 toggle_callback, (XtPointer)0);
  174.     XtAddCallback(w, XmNhelpCallback,
  175.                 help_callback, (XtPointer)"opt_early_w");
  176.  
  177.     n = 0;
  178.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  179.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  180.     XtSetArg(args[n], XmNset,        config.ewarn_mail);    n++;
  181.     w = XtCreateManagedWidget("Send mail", xmToggleButtonWidgetClass,
  182.         rowcol, args, n);
  183.     XtAddCallback(w, XmNvalueChangedCallback,
  184.                 toggle_callback, (XtPointer)1);
  185.     XtAddCallback(w, XmNhelpCallback,
  186.                 help_callback, (XtPointer)"opt_early_m");
  187.  
  188.     form2 = XtCreateManagedWidget("cnfform3", xmFormWidgetClass,
  189.             rowcol, NULL, 0);
  190.     n = 0;
  191.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  192.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  193.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  194.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  195.     XtSetArg(args[n], XmNset,        config.ewarn_exec);    n++;
  196.     w = XtCreateManagedWidget("Execute", xmToggleButtonWidgetClass,
  197.         form2, args, n);
  198.     XtAddCallback(w, XmNvalueChangedCallback,
  199.                 toggle_callback, (XtPointer)2);
  200.     XtAddCallback(w, XmNhelpCallback,
  201.                 help_callback, (XtPointer)"opt_early_x");
  202.  
  203.     n = 0;
  204.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  205.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  206.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  207.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  208.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  209.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  210.     XtSetArg(args[n], XmNwidth,        250);            n++;
  211.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  212.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  213.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  214.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  215.     ewarn_prog = XtCreateManagedWidget("", xmTextFieldWidgetClass,
  216.             form2, args, n);
  217.     XtAddCallback(ewarn_prog, XmNactivateCallback,
  218.                 ewarn_prog_callback, (XtPointer)NULL);
  219.     XtAddCallback(ewarn_prog, XmNhelpCallback,
  220.                 help_callback, (XtPointer)"opt_early_x");
  221.     if (config.ewarn_prog)
  222.         print_text_button(ewarn_prog, "%s", config.ewarn_prog);
  223.  
  224.                             /*-- late warn --*/
  225.     n = 0;
  226.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  227.     XtSetArg(args[n], XmNtopWidget,        frame);            n++;
  228.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  229.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  230.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  231.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  232.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  233.     XtSetArg(args[n], XmNshadowType,    XmSHADOW_ETCHED_IN);    n++;
  234.     frame = XtCreateManagedWidget("", xmFrameWidgetClass,
  235.             form, args, n);
  236.     form2 = XtCreateManagedWidget("cnfform4", xmFormWidgetClass,
  237.             frame, NULL, 0);
  238.     XtAddCallback(form2, XmNhelpCallback,
  239.                     help_callback, (XtPointer)"opt_late");
  240.  
  241.     n = 0;
  242.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  243.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  244.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  245.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  246.     XtSetArg(args[n], XmNwidth,        len);            n++;
  247.     w = XtCreateManagedWidget("Late warning:", xmLabelWidgetClass,
  248.             form2, args, n);
  249.     n = 0;
  250.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  251.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  252.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  253.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  254.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  255.     XtSetArg(args[n], XmNspacing,        4);            n++;
  256.     rowcol = XtCreateManagedWidget("", xmRowColumnWidgetClass,
  257.             form2, args, n);
  258.     n = 0;
  259.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  260.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  261.     XtSetArg(args[n], XmNset,        config.lwarn_window);    n++;
  262.     w = XtCreateManagedWidget("Yellow window", xmToggleButtonWidgetClass,
  263.         rowcol, args, n);
  264.     XtAddCallback(w, XmNvalueChangedCallback,
  265.                 toggle_callback, (XtPointer)3);
  266.     XtAddCallback(w, XmNhelpCallback,
  267.                 help_callback, (XtPointer)"opt_late_w");
  268.  
  269.     n = 0;
  270.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  271.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  272.     XtSetArg(args[n], XmNset,        config.lwarn_mail);    n++;
  273.     w = XtCreateManagedWidget("Send mail", xmToggleButtonWidgetClass,
  274.             rowcol, args, n);
  275.     XtAddCallback(w, XmNvalueChangedCallback,
  276.                 toggle_callback, (XtPointer)4);
  277.     XtAddCallback(w, XmNhelpCallback,
  278.                 help_callback, (XtPointer)"opt_late_m");
  279.  
  280.     form2 = XtCreateManagedWidget("cnfform5", xmFormWidgetClass,
  281.             rowcol, NULL, 0);
  282.     n = 0;
  283.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  284.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  285.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  286.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  287.     XtSetArg(args[n], XmNset,        config.lwarn_exec);    n++;
  288.     w = XtCreateManagedWidget("Execute", xmToggleButtonWidgetClass,
  289.             form2, args, n);
  290.     XtAddCallback(w, XmNvalueChangedCallback,
  291.                 toggle_callback, (XtPointer)5);
  292.     XtAddCallback(w, XmNhelpCallback,
  293.                 help_callback, (XtPointer)"opt_late_x");
  294.  
  295.     n = 0;
  296.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  297.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  298.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  299.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  300.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  301.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  302.     XtSetArg(args[n], XmNwidth,        250);            n++;
  303.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  304.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  305.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  306.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  307.     lwarn_prog = XtCreateManagedWidget("", xmTextFieldWidgetClass,
  308.             form2, args, n);
  309.     XtAddCallback(lwarn_prog, XmNactivateCallback,
  310.                 lwarn_prog_callback, (XtPointer)NULL);
  311.     XtAddCallback(lwarn_prog, XmNhelpCallback,
  312.                 help_callback, (XtPointer)"opt_late_x");
  313.     if (config.lwarn_prog)
  314.         print_text_button(lwarn_prog, "%s", config.lwarn_prog);
  315.  
  316.                             /*-- alarm --*/
  317.     n = 0;
  318.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  319.     XtSetArg(args[n], XmNtopWidget,        frame);            n++;
  320.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  321.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  322.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  323.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  324.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  325.     XtSetArg(args[n], XmNshadowType,    XmSHADOW_ETCHED_IN);    n++;
  326.     frame = XtCreateManagedWidget("", xmFrameWidgetClass,
  327.             form, args, n);
  328.     form2 = XtCreateManagedWidget("cnfform6", xmFormWidgetClass,
  329.             frame, NULL, 0);
  330.     XtAddCallback(form2, XmNhelpCallback,
  331.                     help_callback, (XtPointer)"opt_alarm");
  332.  
  333.     n = 0;
  334.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  335.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  336.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  337.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  338.     XtSetArg(args[n], XmNwidth,        len);            n++;
  339.     w = XtCreateManagedWidget("Alarm:", xmLabelWidgetClass,
  340.             form2, args, n);
  341.     n = 0;
  342.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  343.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  344.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  345.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  346.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  347.     XtSetArg(args[n], XmNspacing,        4);            n++;
  348.     rowcol = XtCreateManagedWidget("", xmRowColumnWidgetClass,
  349.             form2, args, n);
  350.     n = 0;
  351.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  352.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  353.     XtSetArg(args[n], XmNset,        config.alarm_window);    n++;
  354.     w = XtCreateManagedWidget("Red window", xmToggleButtonWidgetClass,
  355.             rowcol, args, n);
  356.     XtAddCallback(w, XmNvalueChangedCallback,
  357.                 toggle_callback, (XtPointer)6);
  358.     XtAddCallback(w, XmNhelpCallback,
  359.                 help_callback, (XtPointer)"opt_alarm_a");
  360.  
  361.     n = 0;
  362.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  363.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  364.     XtSetArg(args[n], XmNset,        config.alarm_mail);    n++;
  365.     w = XtCreateManagedWidget("Send mail", xmToggleButtonWidgetClass,
  366.             rowcol, args, n);
  367.     XtAddCallback(w, XmNvalueChangedCallback,
  368.                 toggle_callback, (XtPointer)7);
  369.     XtAddCallback(w, XmNhelpCallback,
  370.                 help_callback, (XtPointer)"opt_alarm_m");
  371.  
  372.     form2 = XtCreateManagedWidget("cnfform7", xmFormWidgetClass,
  373.             rowcol, NULL, 0);
  374.     n = 0;
  375.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  376.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  377.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  378.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  379.     XtSetArg(args[n], XmNset,        config.alarm_exec);    n++;
  380.     w = XtCreateManagedWidget("Execute", xmToggleButtonWidgetClass,
  381.             form2, args, n);
  382.     XtAddCallback(w, XmNvalueChangedCallback,
  383.                 toggle_callback, (XtPointer)8);
  384.     XtAddCallback(w, XmNhelpCallback,
  385.                 help_callback, (XtPointer)"opt_alarm_x");
  386.  
  387.     n = 0;
  388.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  389.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  390.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  391.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  392.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  393.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  394.     XtSetArg(args[n], XmNwidth,        250);            n++;
  395.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  396.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  397.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  398.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  399.     alarm_prog = XtCreateManagedWidget("", xmTextFieldWidgetClass,
  400.             form2, args, n);
  401.     XtAddCallback(alarm_prog, XmNactivateCallback,
  402.                 alarm_prog_callback, (XtPointer)NULL);
  403.     XtAddCallback(alarm_prog, XmNhelpCallback,
  404.                 help_callback, (XtPointer)"opt_alarm_x");
  405.     if (config.alarm_prog)
  406.         print_text_button(alarm_prog, "%s", config.alarm_prog);
  407.  
  408.                             /*-- mailer --*/
  409.     n = 0;
  410.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  411.     XtSetArg(args[n], XmNtopWidget,        frame);            n++;
  412.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  413.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  414.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  415.     w = XtCreateManagedWidget("Mailer:", xmLabelWidgetClass,
  416.             form, args, n);
  417.     XtAddCallback(w, XmNhelpCallback,
  418.                 help_callback, (XtPointer)"opt_mailer");
  419.  
  420.     n = 0;
  421.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  422.     XtSetArg(args[n], XmNtopWidget,        frame);            n++;
  423.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  424.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  425.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  426.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  427.     XtSetArg(args[n], XmNwidth,        250);            n++;
  428.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  429.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  430.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  431.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  432.     mailer = XtCreateManagedWidget("", xmTextFieldWidgetClass,
  433.             form, args, n);
  434.     XtAddCallback(mailer, XmNactivateCallback,
  435.                 mailer_callback, (XtPointer)NULL);
  436.     XtAddCallback(mailer, XmNhelpCallback,
  437.                 help_callback, (XtPointer)"opt_mailer");
  438.     if (config.mailer)
  439.         print_text_button(mailer, "%s", config.mailer);
  440.  
  441.                             /*-- timeout --*/
  442.     n = 0;
  443.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  444.     XtSetArg(args[n], XmNtopWidget,        mailer);        n++;
  445.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  446.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  447.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  448.     w = XtCreateManagedWidget("Windows time out after", xmLabelWidgetClass,
  449.             form, args, n);
  450.     XtAddCallback(w, XmNhelpCallback,
  451.                 help_callback, (XtPointer)"opt_timeout");
  452.  
  453.     n = 0;
  454.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  455.     XtSetArg(args[n], XmNtopWidget,        mailer);        n++;
  456.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  457.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  458.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  459.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  460.     XtSetArg(args[n], XmNwidth,        120);            n++;
  461.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  462.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  463.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  464.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  465.     timeout = XtCreateManagedWidget("", xmTextFieldWidgetClass,
  466.             form, args, n);
  467.     XtAddCallback(timeout, XmNactivateCallback,
  468.                 timeout_callback, (XtPointer)NULL);
  469.     XtAddCallback(timeout, XmNhelpCallback,
  470.                 help_callback, (XtPointer)"opt_timeout");
  471.     if (config.wintimeout > 59)
  472.         print_text_button(timeout, "%s",
  473.                     mktimestring(config.wintimeout, TRUE));
  474.  
  475.                             /*-- buttons --*/
  476.     n = 0;
  477.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  478.     XtSetArg(args[n], XmNtopWidget,        timeout);        n++;
  479.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  480.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  481.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  482.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  483.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  484.     XtSetArg(args[n], XmNwidth,        80);            n++;
  485.     w = XtCreateManagedWidget("Done", xmPushButtonWidgetClass,
  486.             form, args, n);
  487.     XtAddCallback(w, XmNactivateCallback,
  488.                     done_callback, (XtPointer)0);
  489.     XtAddCallback(w, XmNhelpCallback,
  490.                     help_callback, (XtPointer)"opt_done");
  491.  
  492.     n = 0;
  493.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  494.     XtSetArg(args[n], XmNtopWidget,        timeout);        n++;
  495.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  496.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  497.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  498.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  499.     XtSetArg(args[n], XmNrightWidget,    w);            n++;
  500.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  501.     XtSetArg(args[n], XmNwidth,        80);            n++;
  502.     w = XtCreateManagedWidget("Help", xmPushButtonWidgetClass,
  503.             form, args, n);
  504.     XtAddCallback(w, XmNactivateCallback, help_callback, (XtPointer)"opt");
  505.     XtAddCallback(w, XmNhelpCallback,     help_callback, (XtPointer)"opt");
  506.  
  507.  
  508.     XtPopup(shell, XtGrabNone);
  509.     closewindow = XmInternAtom(display, "WM_DELETE_WINDOW", False);
  510.     XmAddWMProtocolCallback(shell, closewindow,
  511.                     done_callback, (XtPointer)shell);
  512.     have_shell = TRUE;
  513. }
  514.  
  515.  
  516. /*-------------------------------------------------- callbacks --------------*/
  517. /*
  518.  * All of these routines are direct X callbacks.
  519.  */
  520.  
  521. /*ARGSUSED*/
  522. static void done_callback(widget, item, data)
  523.     Widget                widget;
  524.     int                item;
  525.     XmToggleButtonCallbackStruct    *data;
  526. {
  527.     destroy_config_popup();
  528. }
  529.  
  530.  
  531. /*ARGSUSED*/
  532. static void toggle_callback(widget, item, data)
  533.     Widget                widget;
  534.     int                item;
  535.     XmToggleButtonCallbackStruct    *data;
  536. {
  537.     switch(item) {
  538.       case 0:    config.ewarn_window = data->set;    break;
  539.       case 1:    config.ewarn_mail   = data->set;    break;
  540.       case 2:    config.ewarn_exec   = data->set;    break;
  541.       case 3:    config.lwarn_window = data->set;    break;
  542.       case 4:    config.lwarn_mail   = data->set;    break;
  543.       case 5:    config.lwarn_exec   = data->set;    break;
  544.       case 6:    config.alarm_window = data->set;    break;
  545.       case 7:    config.alarm_mail   = data->set;    break;
  546.       case 8:    config.alarm_exec   = data->set;    break;
  547.     }
  548. }
  549.  
  550.  
  551. /*ARGSUSED*/
  552. static void ewarn_prog_callback(widget, item, data)
  553.     Widget                widget;
  554.     int                item;
  555.     XmToggleButtonCallbackStruct    *data;
  556. {
  557.     char                *text = XmTextFieldGetString(widget);
  558.  
  559.     if (config.ewarn_prog)
  560.         free(config.ewarn_prog);
  561.     config.ewarn_prog = mystrdup(text);
  562.     XtFree(text);
  563. }
  564.  
  565.  
  566. /*ARGSUSED*/
  567. static void lwarn_prog_callback(widget, item, data)
  568.     Widget                widget;
  569.     int                item;
  570.     XmToggleButtonCallbackStruct    *data;
  571. {
  572.     char                *text = XmTextFieldGetString(widget);
  573.  
  574.     if (config.lwarn_prog)
  575.         free(config.lwarn_prog);
  576.     config.lwarn_prog = mystrdup(text);
  577.     XtFree(text);
  578. }
  579.  
  580.  
  581. /*ARGSUSED*/
  582. static void alarm_prog_callback(widget, item, data)
  583.     Widget                widget;
  584.     int                item;
  585.     XmToggleButtonCallbackStruct    *data;
  586. {
  587.     char                *text = XmTextFieldGetString(widget);
  588.  
  589.     if (config.alarm_prog)
  590.         free(config.alarm_prog);
  591.     config.alarm_prog = mystrdup(text);
  592.     XtFree(text);
  593. }
  594.  
  595.  
  596. /*ARGSUSED*/
  597. static void mailer_callback(widget, item, data)
  598.     Widget                widget;
  599.     int                item;
  600.     XmToggleButtonCallbackStruct    *data;
  601. {
  602.     char                *text = XmTextFieldGetString(widget);
  603.  
  604.     if (config.mailer)
  605.         free(config.mailer);
  606.     config.mailer = mystrdup(text);
  607.     XtFree(text);
  608. }
  609.  
  610.  
  611. /*ARGSUSED*/
  612. static void timeout_callback(widget, item, data)
  613.     Widget                widget;
  614.     int                item;
  615.     XmToggleButtonCallbackStruct    *data;
  616. {
  617.     char                *text = XmTextFieldGetString(widget);
  618.  
  619.     config.wintimeout = parse_timestring(text);
  620.     XtFree(text);
  621.     print_text_button(timeout, config.wintimeout > 59 ? "%s" : "",
  622.                     mktimestring(config.wintimeout, TRUE));
  623. }
  624.